package com.smart.community.property.controller;

import com.smart.community.commons.result.Result;
import com.smart.community.feign.property.dto.PropertyCompanyPaymentInfoDTO;
import com.smart.community.feign.region.service.IRegionHierarchyFeign;
import com.smart.community.property.service.IPropertyCompanyPaymentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 物业公司支付管理控制器
 * 
 * 提供物业公司支付相关的API接口，包括收款码获取等功能
 * 业务流程：房户ID → 物业公司ID → 收款码信息
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/property/payment")
@Tag(name = "物业公司支付管理", description = "物业公司支付相关接口，支持收款码获取等功能")
public class PropertyCompanyPaymentController {

    @Autowired
    private IPropertyCompanyPaymentService propertyCompanyPaymentService;
    
    @Autowired
    private IRegionHierarchyFeign regionHierarchyFeign;

    /**
     * 根据房户ID获取物业公司收款码信息
     * 
     * 核心支付接口：通过房户ID获取对应的物业公司收款码信息
     * 业务流程：房户ID → 物业公司ID → 收款码信息
     * 
     * @param householdId 房户ID
     * @return 物业公司支付信息，包含收款码、支付账户等
     * @throws Exception 当获取支付信息失败时抛出异常
     */
    @GetMapping("/household/{householdId}/payment-info")
    @Operation(summary = "根据房户ID获取物业公司收款码信息", description = "核心支付接口，通过房户ID获取物业公司收款码信息")
    public Result<PropertyCompanyPaymentInfoDTO> getPaymentInfoByHouseholdId(
            @Parameter(description = "房户ID") @PathVariable("householdId") Long householdId) throws Exception {
        
        log.info("获取房户对应的物业公司收款码信息，房户ID: {}", householdId);
        
        // 第1步：通过区域层级关系Feign接口获取物业公司ID
        Long propertyCompanyId = regionHierarchyFeign.getPropertyCompanyIdByHouseholdId(householdId);
        if (propertyCompanyId == null) {
            log.warn("房户未关联物业公司，房户ID: {}", householdId);
            return Result.fail("房户未关联物业公司，无法获取收款码信息");
        }
        
        // 第2步：根据物业公司ID获取收款码信息
        PropertyCompanyPaymentInfoDTO paymentInfo = propertyCompanyPaymentService.getPropertyCompanyPaymentInfo(propertyCompanyId);
        
        log.info("成功获取房户对应的物业公司收款码信息，房户ID: {}, 物业公司ID: {}, 公司名称: {}", 
                householdId, propertyCompanyId, paymentInfo.getCompanyName());
        
        return Result.success("获取收款码信息成功", paymentInfo);
    }
    
    /**
     * 根据物业公司ID获取收款码信息
     * 
     * 直接获取物业公司收款码信息，用于管理后台等场景
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 物业公司支付信息，包含收款码、支付账户等
     * @throws Exception 当获取支付信息失败时抛出异常
     */
    @GetMapping("/property-company/{propertyCompanyId}/payment-info")
    @Operation(summary = "根据物业公司ID获取收款码信息", description = "直接获取物业公司收款码信息")
    public Result<PropertyCompanyPaymentInfoDTO> getPropertyCompanyPaymentInfo(
            @Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId) throws Exception {
        
        log.info("获取物业公司收款码信息，物业公司ID: {}", propertyCompanyId);
        
        PropertyCompanyPaymentInfoDTO paymentInfo = propertyCompanyPaymentService.getPropertyCompanyPaymentInfo(propertyCompanyId);
        
        log.info("成功获取物业公司收款码信息，物业公司ID: {}, 公司名称: {}", propertyCompanyId, paymentInfo.getCompanyName());
        
        return Result.success("获取收款码信息成功", paymentInfo);
    }
}
